package com.guqj.basis.innerclass;

/**
 * 编译后，生成两个类，一个AnonymousOuter,一个AnonymousOuter$1
 * 
 * public class AnonymousOuter{
 *   public void invoke(final int a, final int b){
 *     AnonymousPoint point = new AnonymousOuter$1();
 *     point.distance(a, b);
 *   }
 * }
 * 
 * public class AnonymousOuter$1 extends AnonymousPoint{
 *   final AnonymousOuter this$0;
 *   final int a;
 *   public AnonymousOuter$1(AnonymousOuter outer, int a){
 *     this.this$0=outer;
 *     this.a=a;
 *   }
 *   
 *   @override
 *   public void distance(int x, int y){
 *     System.out.println("hello");
 *     System.out.println(a);
 *     System.out.println(x - y);
 *   }
 * }
 */
public class AnonymousOuter {

	public void invoke(final int a, final int b) {
		final String str = "hello";
		/**
		 * 匿名内部类只能被使用一次，用来创建一个对象。它没有名字，没有构造方法，但可以根据参数列表，调用对应的父类构造方法。
		 * 匿名内部类也可以访问外部类的所有变量和方法，可以访问方法中的final参数和局部变量。
		 */
		AnonymousPoint point = new AnonymousPoint() {
			@Override
			public void distance(int x, int y) {
				System.out.println(str);
				System.out.println(a);
				System.out.println(x - y);
			}
		};

		point.distance(a, b);
	}

	public static void main(String[] args) {
		new AnonymousOuter().invoke(10, 20);
	}
}
